本回就介紹一下常用的C#存取資料庫的元件,主要ODBC、OLEDB、SQLClient,ODBC的部份有空再補上
但是先說結論,現在的SQLClient比較通用,但未來微軟比較推ODBC。讀取元件的部份,一般而言SqlDataAdapter比較常用到。
ODBC(Open Database Connectivity,開放資料庫互連)ODBC 1.0:發表於1992年9月,提供了一種API作基準,因此有linux ODBC,也有Microsoft ODBC,即使是一種標準,因此這有跨平台版本。ODBC維基連結。以下這個是程式範例:
string connString = @"Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1,1433;Database=Animal;User Id=YourUsername;Password=YourPassword;";
using (OdbcConnection connection = new OdbcConnection(connString))
{
connection.Open();
OdbcCommand command = new OdbcCommand("SELECT * FROM Animal", connection);
using (OdbcDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["name"].ToString());
}
}
}
OLEDB(Object Linking and Embedding, Database,對象連結嵌入資料庫,OLEDB)微軟的資料庫連結組件。OLEDB維基連結。
以下是OLEDB的範例,可以看到這是用OleDbDataReader讀資料的:
string connString = @"Provider=SQLOLEDB;Data Source=127.0.0.1,1433;Initial Catalog=Animal;User Id=YourUsername;Password=YourPassword";
using (OleDbConnection connection = new OleDbConnection(connString))
{
connection.Open();
OleDbCommand command = new OleDbCommand("SELECT [id],[name],[color] FROM [Animal].[dbo].[Animal]", connection);
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["name"].ToString() + reader["color"].ToString());
}
}
}
回傳值
狗 黑
馬 黑
羊 白
SQL Server Native Client
這是 Microsoft SQL Server 的一個技術,它是一個獨立的數據訪問 API。它是一種組合了 OLE DB 和 ODBC 的技術,訪問 SQL Server 資料的元件。
以下再加碼說明以下二者的不同:
(一)SqlDataReader
只讀取前進一行的方式讀資料,必須在線讀取資料
(二)SqlDataAdapter
使用DataSet或DataTable,這元件可離線讀資料,也就是說只要用到DataSet或DataTable就一定是SqlDataAdapter,平常用到這元件的機會比較多
因為前面提到可以離線讀資料,那也可以自己弄出一個數值用以回傳資料,這個特性有時候會用得到,也支援之前提到的json轉換函式。
DataSet支援同時存取多資料表與合併資料表,缺點就是比較消耗系統資源,DataTable簡單說就是DataSet單資料表的版本。以下是SqlDataAdapter使用dataTable讀資料的程式範例:
以下二例子都是SqlDataAdapter
例一,用LINQ處理後接值
// 連接字串
string connectionString = "Data Source=127.0.0.1,1433;Initial Catalog=Animal;Integrated Security=True";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sqlQuery = "SELECT [id], [name],[color] FROM [Animal].[dbo].[Animal]";
// 使用 SqlDataAdapter 執行查詢並將結果存入一個 DataTable
SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, connection);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
// 使用 LINQ 查詢 DataTable
var query = from row in dataTable.AsEnumerable()
select new
{
id = row.Field<int>("id"),
name = row.Field<string>("name"),
color = row.Field<string>("color")
};
Console.WriteLine("Query Result:");
foreach (var result in query)
{
Console.WriteLine($"ID: {result.id}, Name: {result.name}, color: {result.color}");
}
}
回傳值
ID: 1, Name: 狗 , color: 黑
ID: 2, Name: 馬 , color: 黑
ID: 3, Name: 羊 , color: 白
例二,用dataTable接值
string connectionString = "Data Source=127.0.0.1,1433;Initial Catalog=Animal;Integrated Security=True";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sqlQuery = "SELECT [id],[name],[color] FROM [Animal].[dbo].[Animal]";
// 使用 SqlDataAdapter 執行查詢並將結果存入一個 DataTable
SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, connection);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
Console.WriteLine("Query Result:");
for (int i = 0; i < dataTable.Rows.Count; i++)
{
Console.WriteLine($"ID: " + dataTable.Rows[i]["name"]);
}
}
回傳值
Query Result:
ID: 狗
ID: 馬
ID: 羊
以上比較幾種不同的讀取資料的方式,以後在看程式的時候就能比較快看出程式在寫什麼。